// 定义路径重写规则的类型
export type PathRewrite = {
  // key: 需要被替换的路径正则
  // value: 替换后的字符串
  [key: string]: string
}

// 定义每个服务的完整配置
export type ServiceConfig = {
  url: string; // 后端服务地址
  pathRewrite?: PathRewrite; // 可选的路径重写规则 不配置 pathRewrite，保留完整的路径
}

// 定义不同环境的配置
export const envConfigs = {
  dev: {
    // 正常测试环境：通过代理，需要保留 /api 前缀
    // 请求: /api/login/userinfo → http://api.user.dev.com/api/login/userinfo
    apiService: {
      url: 'http://api.user.dev.com',
    } as ServiceConfig,
    screenService: {
      url: 'http://api.product.dev.com',
    } as ServiceConfig
  },
  test: {
    // 直连后端环境：需要去掉 /api 前缀
    // 请求: /api/login/userinfo → http://10.0.0.123:8080/login/userinfo
    apiService: {
      url: 'http://10.0.0.123:8080', // 直连的后端IP
      pathRewrite: {
        '^/api': '' // 
      }
    } as ServiceConfig,
    screenService: {
      url: 'http://10.0.0.124:8081',
      // pathRewrite: {
      //   '^/api': ''
      // }
    } as ServiceConfig
  },
  pro: {
    // 生产环境：通常和测试环境一样，由网关处理
    apiService: {
      url: 'https://api.user.com',
    } as ServiceConfig,
    screenService: {
      url: 'https://api.product.com',
    } as ServiceConfig
  }
}

// 根据 mode 字符串获取环境配置（用于 Node.js 环境，如 vite.config.ts）
export const getFullConfig = (mode: string) => {
  const env = mode === 'production' ? 'pro' : mode === 'test' ? 'test' : 'dev'
  return envConfigs[env as keyof typeof envConfigs]
}

// 获取当前环境（用于客户端代码，浏览器中 import.meta.env 可用）
const getEnv = () => {
  // 在 Node.js 环境中（如 vite.config.ts），import.meta.env 是 undefined
  // 在浏览器环境中，import.meta.env 是可用的
  let mode = 'development'
  try {
    // @ts-ignore - import.meta.env 在浏览器中可用，但在 Node.js 中不可用
    mode = import.meta.env?.MODE || 'development'
  } catch {
    mode = 'development'
  }
  if (mode === 'production') return 'pro'
  if (mode === 'test') return 'test'
  return 'dev'
}

// 导出当前环境下的完整配置（主要用于客户端代码）
export const config = envConfigs[getEnv() as keyof typeof envConfigs]

// 为了方便在Vite配置中使用，我们也导出代理前缀
export const API_PREFIXES = {
  API: '/api',
  SCREEN: '/screen',
}
